mikeo_410
  1. 1.GAS(google Apps Script)
    1. 1.HowTo - google Apps Script
    2. 2.google Apps Script(ウエブアプリ)
    3. 3.ドキュメント(DocumentApp)
    4. 4.ドキュメント用ツールの作り方

ドキュメント(DocumentApp)

  1. 簡単にテーブルを作る
    テーブル、行、セルと順番に作るが以下も可。
    var body = DocumentApp.getActiveDocument().getBody();

body.appendTable([

  ['Cell 1', 'Cell 2'],

  ['Cell 3', 'Cell 4']

]);

  1. カーソル位置に文字列を挿入
    DocumentApp.getActiveDocument().getCursor().insertText("\n");
  2. テーブルのセルは最初からパラグラフが作られる。ListItemはパラグラフに追加できず、セルに追加するので、パラグラフを削除しないと1行空く。
  3. エレメントを作って追加するのではなく、必ず body など、エレメントの appendや insert のメソッドを持つオブジェクトに追加してエレメントを得る。insert は、位置を番号で指定するので、カーソル位置に直接エレメントが作れない。
  1.   let cursor = DocumentApp.getActiveDocument().getCursor();
  2.   if(!cursorthrow new Error("カーソルを適切な場所に設定してください。");
  3.   let ce = cursor.getElement();
  4.   let parent = ce.getParent();
  5.   let table = DocumentApp.getActiveDocument()
  6.                 .getBody().insertTable(parent.getChildIndex(ce));

まだ、不完全で、エレメントの下に入れたい。

  1. ドキュメントに適用するスクリプトに関する記事は3タイプに分かれる。

1つは「ツール」「スクリプトエディタ」で直接「実行」するスクリプト。2つ目はメニューバーに追加するスクリプト。3つ目は「アドオン」に加えるアドオン。

  1. 直接「実行」するスクリプト

一時的に必要な処理は「ツール」「スクリプトエディタ」で直接「実行」する。また、「トリガ」によって実行することが出来る。onOpen()関数は、ドキュメントが開かれたときに呼び出される。onOpen()関数は、メニューやアドオンの設定にも使用できる。

  1. メニューバーに追加するスクリプト

ドキュメントを開いたときに実行されるonOpen()関数でメニューを作って追加する。

  1. function onOpen(){
  2.   var menu = DocumentApp.getUi().createMenu('図表番号');
  3.   menu.addItem('図番','FigureTitle');
  4.   menu.addItem('表番','TableTitle');
  5.   menu.addItem('振り直し','Renumber');
  6.   menu.addToUi();
  7. }

メニューバーに「図表番号」が追加され、そのサブメニューに「図番」「表番」「振り直し」が追加され、それぞれ FigureTitle()、TableTitle()、Renumber() を呼び出す。

  1. アドオン

「アドオン」は、公開されたものが対象のようで、「アドオンの管理」には「ツール」「スクリプトエディタ」で作成したものは現れない。

  1. function onInstall() {
  2.   onOpen();
  3. }
  4. function onOpen() {
  5.   DocumentApp.getUi().createAddonMenu()
  6.       .addItem('Start''showSidebar')
  7.       .addToUi();
  8. }
  9. function showSidebar() {
  10.   var ui = HtmlService.createTemplateFromFile('sidebar')
  11.       .evaluate()
  12.       .setTitle('Code Pane');
  13.   DocumentApp.getUi().showSidebar(ui);
  14. }

しかし、「アドオン」メニューに加えることは出来て使用できる。onOpen()関数で追加するものなので、これがなければ削除になる。問題なのはメニューに追加される名前がプロジェクト名になること。

「ツール」「スクリプトエディタ」でエディタを開くと自動的に「無題のプロジェクト」が作成され、ドキュメントはそのコンテナとなる。管理上、プロジェクト名はドキュメントの名前と一致させたいが、これがアドオンのメニューに出てくる名前となる。

見た限りでは「アドオン」はUIを持ったアプリケーションで、「サイドバー」と呼ばれている。画面の右にテキストエリアやボタンがある帯が表示される。これはHTMLでデザインする。例では sidebar(.html) を作成している。Apps Scriptアプリケーションと同じ。google.script.run を使ってサーバサイドスクリプトを呼び出せる。

  1. 複数のアドオン

「アドオン」メニューに追加される選択肢(名前)は、自動的にプロジェクト名になる。アドオンを複数作成し、それぞれのプロジェクトからスクリプトIDをコピーする。ドキュメントを作成し、「ツール」「スクリプトエディタ」とするとエディタが開いて「無題のプロジェクト」となる。ここに onOpen()を書いて、アドオンを設定する。先に、「ライブラリ+」で複数のアドオンを追加する。ライブラリのID欄に追加されるのはそれぞれのアドオンのプロジェクト名となる。

onOpen()では、「このアドオンのプロジェクト名」.onOpen(); と書いて、それぞれ初期化する。

しかし、メニューには1つしか追加されない。名前はアドオンのプロジェクトではなく、すべてドキュメントを含んだプロジェクトの名前(無題のプロジェクト)になってしまう。同名の場合追加されず、最後に追加した1つのアドオンだけが使えるようだ。

ここで行なった方法は、公開されているアドオンの追加とは異なる。別のインストール方法があるのかも知れないが分からない。

可能な方法として、ドキュメントに付随した onOpen() を以下のように書くことはできる。

  1. function onOpen(){
  2.   DocumentApp.getUi()
  3.     .createAddonMenu()
  4.     .addItem('SourceCodePane','SourceCodePane.showSidebar')
  5.     .addItem('CodePane','CodePane.showSidebar')
  6.     .addToUi();
  7. }

アドオンとして、SourceCodePane と CodePane と言う2つのプロジェクトを作成した。これをドキュメントのエディタでライブラリに追加した。複数の自作のアドオンを使うことはできる。

  1. ライブラリに追加

ライブラリの追加に必要なのはスクリプトIDで、一意のプロジェクトの識別子で、プロジェクトと同じ寿命のコード(不変)と考えて良いようだ。

  1. ライブラリの目的
    ライブラリは、ドキュメントのエディタで記述するスクリプトから呼び出す関数群を収めるのに使えます。ライブラリの追加を行うと、IDの欄にライブラリのプロジェクト名が入ります。IDの欄は変更が可能です。[このID].関数名で使います。混乱を避けるには、ライブラリのプロジェクト名は短い英数で付けて置くことだと思います。

しかし、ドキュメントを作成する際の補助となるツールを作る方法としては不完全です。ドキュメントを作成する場合に必ずスクリプトエディタを起動してプロジェクト化することになります。また、必ずスクリプトを書く必要があります。ファイル作成やスクリプトのコピーより作業が少ないことだけがメリットです。

アドオンのモデルはUIを持ち、ドキュメントの選択領域を加工したものをUIに表示し、ボタン等の操作で結果をドキュメントの選択領域に反映します。例えば、選択領域を翻訳し、結果を挿入するとか、ドキュメントに貼り付けたソースコードをコードブロックらしくカラーリングして表示すると言ったものがあります。

こうしたアドオンのようなものをライブラリで使いまわそうとすると2つ問題が起きます。

  1. function onOpen() {
  2.   DocumentApp.getUi().createAddonMenu()
  3.       .addItem('Start''showSidebar')
  4.       .addToUi();
  5. }

ドキュメントの「アドオン」に項目を追加してUIを起動します。上のスクリプトがドキュメントにバインドされたスクリプトのものなら、バインドされた同じスクリプトの showSidebar() がメニューから呼び出されます。このコードがライブラリにあっても、やはりドキュメントにバインドされたスクリプトの showSidebar() が呼び出されることが最初の問題です。

  1.    .addItem('CodePane','CodePane.showSidebar')

この問題は、ライブラリとするスクリプトを含んだプロジェクト名を固定して、最初からライブラリの名前(ID欄の名前)を加えて置くことで回避できます。

2つ目の問題は、google.script.run によるサーバサイドスクリプトの実行は、ライブラリの関数を直接呼べないと言うことです。呼び出すのはUIとなるHTMLに含まれるJavaScriptです。例えば、サーバサイドスクリプトの insertText() を呼び出そうとして、CodePane. insertText() と書いても、ブラウザのインタプリタは対応しません。

現在できることは、ライブラリにするスクリプトには細工をしないで、ライブラリを使用する側でスクリプトを書くことです。

  1. function onOpen() {
  2.   CodePane.onInstall();
  3. }
  4. function showSidebar(){
  5.   CodePane.showSidebar();
  6. }
  7. function insertText(html){
  8.   CodePane.insertText(html);
  9. }

ライブラリを追加する際のID欄が CodePane だとして、onOpen()はドキュメントを開くたびに呼び出され、アドオンメニューに項目を追加します。メニューから選択されると showSidebar() を呼び出すように設定されているので、これを書いてライブラリの関数にリダイレクトします。insertText()は、アドオンのUIのJavaScriptから呼び出されるサーバサイドスクリプトですが、これもリダイレクトします。

メニューバーに登録して起動だけを行なうスクリプトならプロジェクト名を固定して、ライブラリとなるスクリプト内にプロジェクト名を付けて記述することにします。

いずれも複数になることは確実なので、ドキュメントには、それぞれメニューを登録するスクリプトを(ファイルとしてコピーすることができないので)カット&ペーストすることは止む追えないようです。


題目一覧へmikeo_410@hotmail.com(updated: 2022/09/08)